#ifndef FS_H
#define FS_H

#include <stdint.h>
#include <stddef.h>

#define MAX_FILES 1024
#define MAX_FILENAME 28
#define MAX_DENTRY_PER_BLOCK  (BLOCK_SIZE / sizeof(DirEntry))
#define INODE_DIRECT_PTRS 8
#define FS_MAGIC 0x20240617

// 文件类型
typedef enum {
    FILE_TYPE_UNUSED = 0,
    FILE_TYPE_FILE,
    FILE_TYPE_DIR
} FileType;

// 超级块：记录全局信息
typedef struct {
    uint32_t magic;           // 文件系统标识
    uint32_t total_blocks;    // 总块数
    uint32_t inode_bitmap_start;
    uint32_t data_bitmap_start;
    uint32_t inode_table_start;
    uint32_t data_block_start;
} SuperBlock;

// inode：文件元信息
typedef struct {
    FileType type;              // 4 bytes
    uint32_t size;              // 4 bytes
    uint32_t direct_ptr[8];     // 32 bytes
    uint8_t reserved[24];       // 填充，使结构大小为 64 字节
} Inode;

// 目录项
typedef struct {
    char name[MAX_FILENAME];  // 文件名
    uint32_t inode_id;        // inode编号
} DirEntry;

typedef struct {
    int inode_id;
    int type;       // 0 = 文件，1 = 目录
    size_t size;    // 文件大小（字节）
} FileInfo;

// 供其他模块使用的全局超级块指针
extern SuperBlock super_block;

// 核心函数
int fs_format();                            // 格式化文件系统
int fs_mount();                             // 加载已有文件系统
int fs_create_file(const char *path);       // 创建文件
int fs_create_dir(const char *path);        // 创建目录
int fs_delete(const char *path);            // 删除文件或目录
int fs_list_dir(const char *path);          // 显示目录内容
int fs_write_file(const char *path, const void *buf, size_t size);
int fs_read_file(const char *path, void *buf, size_t size);
// 其他功能函数
int fs_stat(const char *path, FileInfo *info);
int fs_rename(const char *old_path, const char *new_path);

// 辅助函数
int alloc_inode();
int alloc_block();
void free_inode(int inode_id);
void free_block(int block_id);
int path_parent(const char *path, char *parent_out, char *name_out);
int path_lookup(const char *path);
int dir_add_entry(int dir_inode_id, const char *name, int inode_id);
int dir_remove_entry(int dir_inode_id, const char *name);

#endif // FS_H
